#include <stdio.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>

int main() {
    cudaDeviceProp prop;
    cudaGetDeviceProperties(&prop, 0); // 0 表示第一块 GPU

    // 设备基本信息 
    printf("===== 设备基本信息 =====\n");
    printf("GPU Name: %s\n", prop.name);
    printf("全局内存总量（字节）: %lu MB\n", prop.totalGlobalMem / 1024 / 1024);
    printf("常量内存总量（字节）: %lu KB\n", prop.totalConstMem / 1024);
    printf("每个线程块的共享内存最大为（字节）: %lu KB\n", prop.sharedMemPerBlock / 1024);  // 48KB 
    printf("每个 SM 的共享内存大小（字节）: %lu KB\n", prop.sharedMemPerMultiprocessor / 1024);
    printf("每个线程块的寄存器数量: %d\n\n", prop.regsPerBlock);

    // 线程与块配置 
    printf("===== 线程与块配置 =====\n");
    printf("每个 Block 的最大线程数: %d\n", prop.maxThreadsPerBlock);
    printf("每个 SM 的最大线程数: %d\n", prop.maxThreadsPerMultiProcessor);
    printf("Block 各维度的最大线程数: [%d, %d, %d]\n", prop.maxThreadsDim[0], prop.maxThreadsDim[1], prop.maxThreadsDim[2]);
    printf("Grid 各维度的最大 Block 数: [%d, %d, %d]\n", prop.maxGridSize[0], prop.maxGridSize[1], prop.maxGridSize[2]);
    printf("Warp 大小（固定为 32）: %d\n\n", prop.warpSize);

    // 流多处理器（SM）信息 
    printf("===== 流多处理器（SM）信息 =====\n");
    printf("SM 数量: %d\n", prop.multiProcessorCount);
    printf("每个 SM 的最大 Block 数: %d\n", prop.maxBlocksPerMultiProcessor);
    printf("是否支持并发 Kernel 执行: %d\n\n", prop.concurrentKernels);

    // 内存与缓存 
    printf("===== 内存与缓存 =====\n");
    printf("显存总线宽度（位）: %d\n", prop.memoryBusWidth);
    printf("显存时钟频率（kHz）: %d M\n", prop.memoryClockRate / 1024 /1024);
    printf("L2 缓存大小（字节）: %d MB\n", prop.l2CacheSize / 1024 / 1024);
    printf("持久化 L2 缓存最大值: %d MB\n\n", prop.persistingL2CacheMaxSize / 1024 /1024);
    // printf("全局内存总线宽度: %d\n\n", prop.globalMemoryBusWidth);

    // 其他 
    printf("===== 其他 =====\n");
    printf("major: %d\n", prop.major);
    printf("minor: %d\n", prop.minor);


    // 获取每个SM的最大线程数
    int device = 0;
    int maxThreadsPerSM;
    cudaDeviceGetAttribute(&maxThreadsPerSM, 
                          cudaDevAttrMaxThreadsPerMultiProcessor, device);
    printf("Max threads per SM: %d\n", maxThreadsPerSM);
    
    // RTX 4060的Tensor Core信息
    // 是的，NVIDIA GeForce RTX 4060包含Tensor Core。具体来说：

    // 架构基础：

    // RTX 4060基于NVIDIA的Ada Lovelace架构（属于SM 8.9计算能力）

    // 这是继Ampere架构之后的新一代GPU架构

    // Tensor Core配置：

    // 每个SM包含4个第三代Tensor Core

    // 支持所有现代精度格式：

    // FP16

    // BF16

    // TF32

    // INT8

    // INT4

    // 特别优化了AI工作负载性能

    // 具体规格（以RTX 4060移动版为例）：

    // SM数量：24个

    // 总Tensor Core数量 = 24 SMs × 4 Tensor Core/SM = 96个Tensor Core

    // 相比上一代RTX 3060（Ampere架构），每个Tensor Core的性能有显著提升

    // 实际应用：

    // 显著加速DLSS 3帧生成

    // 提升AI推理性能（如Stable Diffusion等应用）

    // 支持新的OPUS张量处理指令

    
    return 0;
}

// ===== 设备基本信息 =====
// GPU Name: NVIDIA GeForce RTX 4060 Laptop GPU
// 全局内存总量（字节）: 8187 MB
// 常量内存总量（字节）: 64 KB
// 每个线程块的共享内存最大为（字节）: 48 KB
// 每个 SM 的共享内存大小（字节）: 100 KB
// 每个线程块的寄存器数量: 65536

// ===== 线程与块配置 =====
// 每个 Block 的最大线程数: 1024
// 每个 SM 的最大线程数: 1536
// Block 各维度的最大线程数: [1024, 1024, 64]
// Grid 各维度的最大 Block 数: [2147483647, 65535, 65535]
// Warp 大小（固定为 32）: 32

// ===== 流多处理器（SM）信息 =====
// SM 数量: 24
// 每个 SM 的最大 Block 数: 24
// 是否支持并发 Kernel 执行: 1

// ===== 内存与缓存 =====
// 显存总线宽度（位）: 128
// 显存时钟频率（kHz）: 7 M
// L2 缓存大小（字节）: 32 MB
// 持久化 L2 缓存最大值: 22 MB